home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib11.dsk / DISK DOCTOR.bas < prev    next >
BASIC Source File  |  2023-02-26  |  12KB  |  300 lines

  1. 10  REM  **********************
  2. 11  REM  * DISK DOCTOR        *
  3. 12  REM  * BY BEN COLLEY      *
  4. 13  REM  * COPYRIGHT (C) 1982 *
  5. 14  REM  * BY MICROSPARC INC  *
  6. 15  REM  * LINCOLN, MA 01773  *
  7. 16  REM  **********************
  8. 18  GOSUB 10000
  9. 20  FOR I = 1 TO 2  STEP 0
  10. 30  GOSUB 500
  11. 40  ON SEL GOSUB 1000,2000,3000,4000,5000,6000
  12. 50  NEXT 
  13. 60  TEXT : HOME : END 
  14. 500  HOME 
  15. 505  VTAB 5: HTAB 15: INVERSE : PRINT " OPTIONS ": NORMAL 
  16. 510  VTAB 8
  17. 520  HTAB 12: PRINT "1) DUMP SECTOR": PRINT 
  18. 530  HTAB 12: PRINT "2) ZAP SECTOR": PRINT 
  19. 540  HTAB 12: PRINT "3) RECOVER FILE": PRINT 
  20. 550  HTAB 12: PRINT "4) REMOVE DOS": PRINT 
  21. 560  HTAB 12: PRINT "5) SET DRIVE PARMS": PRINT 
  22. 570  HTAB 12: PRINT "6) END": PRINT 
  23. 580  FOR XX = 1 TO 2  STEP 0: VTAB 22: INPUT "ENTER SELECTION:";S$: IF S$ >"0"  AND S$ <"7"  THEN XX = 2
  24. 590  NEXT 
  25. 600 SEL =  VAL(S$): RETURN 
  26. 1000  HOME 
  27. 1010  FOR XX = 1 TO 2  STEP 0: VTAB 7: HTAB 5: INPUT "ENTER TRACK:";S$:TRK =  VAL(S$): IF TRK > -1  AND TRK <35  AND S$ < >""  THEN XX = 2
  28. 1020  IF   NOT (S$ > = "0"  AND S$ < = "9")  THEN XX = 1
  29. 1030  NEXT 
  30. 1040  FOR XX = 1 TO 2  STEP 0: VTAB 9: HTAB 5: INPUT "ENTER SECTOR:";S$:SEC =  VAL(S$): IF SEC > -1  AND SEC <16  AND S$ < >""  THEN XX = 2
  31. 1050  IF   NOT (S$ > = "0"  AND S$ < = "9")  THEN XX = 1
  32. 1060  NEXT 
  33. 1070  FOR XX = 1 TO 2  STEP 0: VTAB 11: HTAB 5: INPUT "LIST ON PRINTER? (Y/N):";S$: IF S$ = "Y"  OR S$ = "N"  THEN XX = 2
  34. 1080  NEXT 
  35. 1090  POKE ITRK,TRK: POKE ISEC,SEC
  36. 1100  POKE ICMD,RD: CALL RWTS
  37. 1110  IF  PEEK(IERR) < >0  THEN  GOSUB 11000: RETURN 
  38. 1120  IF S$ = "Y"  THEN INC = 16: PRINT  CHR$(4);"PR#1": PRINT  CHR$(9);"80N";: PRINT "TRACK=";TRK;"   SECTOR=";SEC: PRINT 
  39. 1130  IF S$ = "N"  THEN INC = 8: HOME : PRINT "        TRACK=";TRK;"    SECTOR=";SEC: PRINT 
  40. 1140  FOR XX = BUF TO BUF +256 -INC  STEP INC
  41. 1150  IF XX = BUF +128  AND S$ = "N"  THEN  VTAB 22: INPUT "PRESS RETURN TO CONTINUE:";X$: VTAB 5: CALL ESCF
  42. 1160  POKE BYTE,XX -BUF: CALL PRBYTE
  43. 1170  PRINT ":  ";
  44. 1180  FOR XY = 0 TO INC -1
  45. 1190  POKE BYTE, PEEK(XX +XY): CALL PRBYTE: REM  PRINT 1 BUFFER BYTE
  46. 1200  IF  INT(XY/2) *2 < >XY  THEN  PRINT " ";
  47. 1210  NEXT 
  48. 1220  PRINT "   :";
  49. 1230  FOR XY = 0 TO INC -1
  50. 1240 XZ =  PEEK(XX +XY): IF XZ >127  THEN XZ = XZ -128
  51. 1250  IF XZ <32  THEN XZ = 46
  52. 1260  PRINT  CHR$(XZ);
  53. 1270  NEXT 
  54. 1280  PRINT ":": NEXT 
  55. 1290  IF S$ = "N"  THEN  VTAB 22: INPUT "PRESS RETURN TO CONTINUE:";X$
  56. 1300  IF S$ = "Y"  THEN  PRINT : PRINT : PRINT  CHR$(4);"PR#0"
  57. 1310  RETURN 
  58. 2000  HOME 
  59. 2005  FOR XX = 1 TO 2  STEP 0: VTAB 7: HTAB 5: INPUT "ENTER TRACK:";S$:TRK =  VAL(S$): IF TRK > -1  AND TRK <35  AND S$ < >""  THEN XX = 2
  60. 2010  IF   NOT (S$ > = "0"  AND S$ < = "9")  THEN XX = 1
  61. 2015  NEXT 
  62. 2020  FOR XX = 1 TO 2  STEP 0: VTAB 9: HTAB 5: INPUT "ENTER SECTOR:";S$:SEC =  VAL(S$): IF SEC > -1  AND SEC <16  AND S$ < >""  THEN XX = 2
  63. 2025  IF   NOT (S$ > = "0"  AND S$ < = "9")  THEN XX = 1
  64. 2030  NEXT 
  65. 2035  POKE ITRK,TRK: POKE ISEC,SEC
  66. 2040  POKE ICMD,RD: CALL RWTS
  67. 2045  IF  PEEK(IERR) < >0  THEN  GOSUB 11000: RETURN 
  68. 2050  HOME : PRINT "        TRACK=";TRK;"    SECTOR=";SEC: PRINT 
  69. 2055  VTAB 22: HTAB 1: PRINT " >AGE FLIP   >OVE   >DIT   >RITE   >EXIT";
  70. 2060  INVERSE : HTAB 1: VTAB 22
  71. 2065  PRINT "P";: HTAB 13:: PRINT "M";: HTAB 20: PRINT "E";: HTAB 27: PRINT "W";: HTAB 35: PRINT "X";
  72. 2070  NORMAL 
  73. 2075 B1 = 0:B2 = 128:T =  -128: GOSUB 2800
  74. 2080 VK = 1:SEL = 13: REM  MODE=MOVE
  75. 2085  FOR XX = 1 TO 2  STEP 0
  76. 2090  IF VK = 0  THEN  GOSUB 2975
  77. 2095  IF SEL = 5  THEN  GOSUB 2400
  78. 2100  IF SEL = 13  THEN  GOSUB 2700
  79. 2105  IF SEL = 16  THEN B1 = B1 +T:B2 = B2 +T: GOSUB 2800
  80. 2110  IF SEL = 23  THEN XX = 2
  81. 2115  IF SEL = 24  THEN XX = 2
  82. 2120  NEXT 
  83. 2125  IF SEL = 23  THEN  POKE ICMD,WR: CALL RWTS: IF  PEEK(IERR) < >0  THEN  GOSUB 11000
  84. 2130  RETURN 
  85. 2393  REM 
  86. 2395  REM  EDIT MODE
  87. 2398  REM 
  88. 2400  VTAB 3: HTAB 34: INVERSE : PRINT "EDIT";: NORMAL 
  89. 2402  VTAB 24: HTAB 6: PRINT "<0-F>-HEX DIGIT   OR  <-, ->";
  90. 2405  FOR XY = 1 TO 2  STEP 0
  91. 2410 HT = HT +1: REM  MOVE TO NEXT NIBBLE
  92. 2415  IF HT >24  THEN HT = 6:VT = VT +1: IF VT >20  THEN VT = 5
  93. 2420  IF  INT(HT/5) *5 = HT  THEN HT = HT +1: REM  CHECK FOR COL 10,15,20
  94. 2425  GOSUB 2975:VK = 0
  95. 2430  IF (S$ > = "0"  AND S$ < = "9")  OR (S$ > = "A"  AND S$ < = "F")  THEN  GOSUB 2500:VK = 1
  96. 2435  IF SEL = 13  THEN VK = 1:XY = 2: REM  SWITCH TO MOVE
  97. 2440  IF SEL = 16  THEN B1 = B1 +T:B2 = B2 +T: GOSUB 2800: REM  PAGE FLIP
  98. 2445  IF SEL = 23  THEN VK = 1:XY = 2: REM  EXIT
  99. 2450  IF SEL = 24  THEN VK = 1:XY = 2: REM  WRITE
  100. 2455  IF SEL = 21  THEN VK = 1: REM  RIGHT ARROW
  101. 2460  IF SEL = 8  THEN VK = 1:HT = HT -2: IF HT <5  THEN HT = 24:VT = VT -1: IF VT <5  THEN VT = 20: REM  LEFT ARROW
  102. 2465  IF SEL = 8  AND ( INT((HT +1)/5) *5 = HT +1)  THEN HT = HT -1: REM  CHECK COL 10,15,20
  103. 2470  IF VK = 0  THEN HT = HT -1: REM  NO VALID KEY
  104. 2475  NEXT 
  105. 2480  REM  SET HT TO NEXT CELL BEFORE LEAVING
  106. 2485 HT =  INT((HT +4)/5) *5: IF HT >20  THEN HT = 5:VT = VT +1: IF VT >20  THEN VT = 5
  107. 2488  VTAB 24: HTAB 1: PRINT  SPC( 35);
  108. 2490  RETURN 
  109. 2495  REM  PREPARE FOR AND CALL ZAP
  110. 2496  REM  CALC BUFFER DISPLACEMENT
  111. 2500 X1 = (VT -5) *8 +ZTBL(HT -6) -30
  112. 2505  IF  PEEK(1536) = 184  THEN X1 = X1 +128: REM  NIBBLE IN 2ND HALF OF SECTOR
  113. 2510  POKE BDISP,X1
  114. 2515 BIT = 0
  115. 2520  IF ZTBL(HT -6) = ZTBL(HT -5)  THEN BIT = 128: REM  DET IF LEFT NIBBLE
  116. 2525  IF S$ < = "9"  THEN  POKE BYTE, VAL(S$) +BIT
  117. 2530  IF S$ > = "A"  THEN  POKE BYTE, ASC(S$) -55 +BIT
  118. 2535  CALL ZAP: REM  ZAP THE NIBBLE
  119. 2540  REM  NOW UPDATE DISPLAY
  120. 2544  VTAB VT
  121. 2545  HTAB HT: PRINT S$;: REM  PRINT NIBBLE
  122. 2550 X1 =  PEEK(BUF +X1): REM  GET NEW VALUE
  123. 2555  VTAB VT: HTAB ZTBL(HT -6): REM  POS FOR CHAR
  124. 2560  IF X1 >127  THEN X1 = X1 -128
  125. 2565  IF X1 <32  THEN X1 = 46
  126. 2570  PRINT  CHR$(X1);: REM  PRINT CHARACTER
  127. 2575  RETURN 
  128. 2685  REM 
  129. 2690  REM  MOVE MODE
  130. 2695  REM 
  131. 2700  VTAB 3: HTAB 34: INVERSE : PRINT "MOVE";: NORMAL 
  132. 2705  VTAB 24: HTAB 3: PRINT "<I>-UP <M>-DOWN <J>-LEFT <K>-RIGHT";
  133. 2710  FOR XY = 1 TO 2  STEP 0
  134. 2715  GOSUB 2975:VK = 0
  135. 2720  IF S$ = "K"  THEN HT = HT +5: IF HT >20  THEN HT = 5:VT = VT +1: IF VT >20  THEN VT = 5
  136. 2725  IF S$ = "J"  THEN HT = HT -5: IF HT <5  THEN HT = 20:VT = VT -1: IF VT <5  THEN VT = 20
  137. 2730  IF S$ = "I"  THEN VT = VT -1: IF VT <5  THEN VT = 20
  138. 2735  IF S$ = "M"  THEN VT = VT +1: IF VT >20  THEN VT = 5
  139. 2740  IF SEL = 5  THEN VK = 1:XY = 2
  140. 2745  IF SEL = 16  THEN B1 = B1 +T:B2 = B2 +T: GOSUB 2800
  141. 2750  IF SEL = 23  THEN VK = 1:XY = 2
  142. 2755  IF SEL = 24  THEN VK = 1:XY = 2
  143. 2760  NEXT 
  144. 2765  VTAB 24: PRINT  SPC( 38);
  145. 2770  RETURN 
  146. 2800  POKE 35,21: VTAB 5: HTAB 1: CALL ESCF: POKE 35,24: REM  CLEAR MIDDLE OF SCREEN
  147. 2805  FOR X1 = BUF +B1 TO BUF +B2 -8  STEP 8
  148. 2810  POKE BYTE,X1 -BUF: CALL PRBYTE
  149. 2815  PRINT ":  ";
  150. 2820  FOR X2 = 0 TO 7
  151. 2825  POKE BYTE, PEEK(X1 +X2): CALL PRBYTE
  152. 2830  IF  INT(X2/2) *2 < >X2  THEN  PRINT " ";
  153. 2835  NEXT 
  154. 2840  PRINT "   :";
  155. 2845  FOR X2 = 0 TO 7
  156. 2850 X3 =  PEEK(X1 +X2)
  157. 2855  IF X3 >127  THEN X3 = X3 -128
  158. 2860  IF X3 <32  THEN X3 = 46
  159. 2865  PRINT  CHR$(X3);
  160. 2870  NEXT 
  161. 2875  PRINT ":"
  162. 2880  NEXT 
  163. 2885 T =  -T
  164. 2890 VK = 0:SEL = 0:VT = 5:HT = 5: REM  INIT CURSOR POSITION
  165. 2895  RETURN 
  166. 2975  VTAB VT: HTAB HT: REM  POSITION CURSOR
  167. 2980  GET S$: PRINT  CHR$(0): REM  PRINT NON-DISPLAY CHAR
  168. 2985  IF S$ < >""  THEN SEL =  ASC(S$)
  169. 2990  IF S$ =  CHR$(0)  THEN SEL = 0
  170. 2995  RETURN 
  171. 3000  FOR XX = 1 TO 2  STEP 0: HOME : VTAB 7
  172. 3010  HTAB 3: INPUT "ENTER FILE NAME:";S$
  173. 3020  IF  LEN(S$) < >0  THEN XX = 2
  174. 3030  NEXT 
  175. 3040  POKE ITRK,17
  176. 3050 XU = 0
  177. 3060  FOR XX = 15 TO 1  STEP  -1
  178. 3070  POKE ISEC,XX
  179. 3080  POKE ICMD,RD: CALL RWTS
  180. 3090  IF  PEEK(IERR) < >0  THEN  GOSUB 11000: RETURN 
  181. 3100  FOR XY = 11 TO 221  STEP 35
  182. 3110  IF  PEEK(BUF +XY) = 255  THEN  GOSUB 3500
  183. 3120  IF XU = 1  THEN  POKE (BUF +XY), PEEK(BUF +XY +32): POKE (BUF +XY +32),160: POKE ICMD,WR: CALL RWTS:XY = 221:XX = 1: IF  PEEK(IERR) < >0  THEN  GOSUB 11000: RETURN 
  184. 3130  IF  PEEK(BUF +XY) + PEEK(BUF +XY +1) = 0  THEN XY = 221:XX = 1
  185. 3140  NEXT : NEXT 
  186. 3150  VTAB 18: HTAB 5
  187. 3160  IF XU = 1  THEN  PRINT "FILE RECOVERED IN VTOC": VTAB 20: HTAB 5: PRINT "REMEMBER TO LOAD AND SAVE IT"
  188. 3170  IF XU = 0  THEN  PRINT "      FILE NOT FOUND"
  189. 3180  FOR XX = 1 TO 1500: NEXT 
  190. 3190  RETURN 
  191. 3500  IF  LEN(S$) <30  THEN S$ = S$ + MID$ ("                              ",1,30 - LEN(S$)): REM  30 SPACES
  192. 3510 XU = 1
  193. 3520  FOR XZ = 1 TO 29
  194. 3530  IF  PEEK(BUF +XY +XZ +2) < > ASC( MID$ (S$,XZ,1)) +128  THEN XU = 0:XZ = 30
  195. 3540  NEXT 
  196. 3550  RETURN 
  197. 4000  REM  REMOVE DOS
  198. 4010  HOME : VTAB 7
  199. 4020  PRINT " IF DOS IS REMOVED YOU CAN NOT BOOT THE": PRINT 
  200. 4030  PRINT " DISK.  DO YOU WANT TO CONTINUE? (Y/N)"
  201. 4040  FOR XX = 1 TO 2  STEP 0
  202. 4050  VTAB 9: HTAB 39: INPUT "";S$
  203. 4060  IF S$ = "N"  OR S$ = "Y"  THEN XX = 2
  204. 4070  NEXT 
  205. 4080  IF S$ = "N"  THEN  RETURN 
  206. 4090  POKE ITRK,17: POKE ISEC,0
  207. 4100  POKE ICMD,RD: CALL RWTS: REM  READ THE VTOC
  208. 4110  IF  PEEK(IERR) < >0  THEN  GOSUB 11000: RETURN 
  209. 4120  POKE BUF +56,0: POKE BUF +57,0: REM  TRK 0 NOT AVAILABLE
  210. 4130  FOR XX = 60 TO 64  STEP 4: POKE BUF +XX,255: POKE BUFF +XX +1,255: NEXT 
  211. 4140  POKE ICMD,WR: CALL RWTS
  212. 4150  IF  PEEK(IERR) < >0  THEN  GOSUB 11000: RETURN 
  213. 4160  FOR XX = 1 TO 118: POKE BUF +XX -1,NDB(XX): NEXT 
  214. 4170  FOR XX = 118 TO 255: POKE BUF +XX,0: NEXT 
  215. 4180  POKE ITRK,0: POKE ISEC,0
  216. 4190  CALL RWTS: REM  WRITE BOOT SECTOR
  217. 4200  IF  PEEK(IERR) < >0  THEN  GOSUB 11000
  218. 4210  RETURN 
  219. 5000  HOME : VTAB 6
  220. 5010  HTAB 10: PRINT "CURRENT SLOT:"; PEEK(IBSL)/16: PRINT 
  221. 5020  HTAB 9: PRINT "CURRENT DRIVE:"; PEEK(IDRV): PRINT 
  222. 5030  FOR XX = 1 TO 2  STEP 0: VTAB 12: HTAB 14: INPUT "NEW SLOT:";S$:S$ =  LEFT$(S$,1): IF S$ >"0"  AND S$ <"8"  THEN XX = 2
  223. 5040  NEXT 
  224. 5050  POKE IBSL, VAL(S$) *16
  225. 5060  FOR XX = 1 TO 2  STEP 0: VTAB 14: HTAB 13: INPUT "NEW DRIVE:";S$:S$ =  LEFT$(S$,1): IF S$ >"0"  AND S$ <"3"  THEN XX = 2
  226. 5070  NEXT 
  227. 5080  POKE IDRV, VAL(S$)
  228. 5090  RETURN 
  229. 6000 I = 2: RETURN 
  230. 10000  REM  ***** SETUP *****
  231. 10010  REM  INSTALL INTERFACES
  232. 10020  FOR XX = 770 TO 833: READ XY: POKE XX,XY: NEXT 
  233. 10030  CALL 770: REM  GET IOB ADDR
  234. 10040 IOB =  PEEK(6) +( PEEK(7) *256)
  235. 10050 IBSL = IOB +1
  236. 10060 IDRV = IOB +2
  237. 10070 IVOL = IOB +3
  238. 10080 ITRK = IOB +4
  239. 10090 ISEC = IOB +5
  240. 10100 ICMD = IOB +12
  241. 10110 IERR = IOB +13
  242. 10120 IAVOL = IOB +14
  243. 10130 BUF =  PEEK(IOB +8) +( PEEK(IOB +9) *256)
  244. 10140  POKE IVOL,0: REM  CLEAR VOLUME ID
  245. 10150 RWTS = 780
  246. 10160 RD = 1:WR = 2
  247. 10170  TEXT : HOME 
  248. 10180  PRINT "  * * * *    DISK DOCTOR    * * * * ": POKE 34,2
  249. 10190 PRBYTE = 800
  250. 10200 ESCF = 64578
  251. 10210 BYTE = 8
  252. 10220 ZAP = 810:BDISP = 26: REM  ZAP VARIABLES
  253. 10230  POKE 27, PEEK(IOB +8): POKE 28, PEEK(IOB +9)
  254. 10240  DIM NDB(118)
  255. 10250  FOR XX = 1 TO 118: READ NDB(XX): NEXT 
  256. 10260  DIM ZTBL(19)
  257. 10270  FOR I = 0 TO 19: READ ZTBL(I): NEXT 
  258. 10280  RETURN 
  259. 10290  REM  RWTS INTERFACE
  260. 10300  DATA  32,227,3,133,7,132,6,96,234,234
  261. 10310  DATA  165,7,164,6,32,217,3,176,6
  262. 10320  DATA  169,0,160,13,145,6,96
  263. 10330  DATA  234,234,234,234
  264. 10340  REM  MONITOR PRBYTE INTERFACE
  265. 10350  DATA  165,8,32,218,253,96
  266. 10360  REM  NIBBLE ZAP ROUTINE
  267. 10370  DATA  234,234,234,234,162,240,165,8,16
  268. 10380  DATA  8,10,10,10,10,133,8,162,15,138
  269. 10390  DATA  164,26,49,27,5,8,145,27,96
  270. 10400  REM  BOOT ROUTINE WHEN DOS REMOVED
  271. 10410  DATA  1,157,136,192,142,244,3,138,74
  272. 10420  DATA  74,74,74,9,192,141,45,8,165
  273. 10430  DATA  0,141,44,8,32,96,251,162,0
  274. 10440  DATA  189,46,8,240,6,32,240,253,232
  275. 10450  DATA  208,245,32,111,253,108,44,8,0
  276. 10460  DATA  0,141,141,160,160,160,160,160,160
  277. 10470  DATA  160,160,160,206,207,160,196,207,211
  278. 10480  DATA  160,207,206,160,212,200,201,211,160
  279. 10490  DATA  196,201,211,203,141,141,160,160,201
  280. 10500  DATA  206,211,197,210,212,160,196,201,211
  281. 10510  DATA  203,160,215,201,212,200,160,196,207
  282. 10520  DATA  211,160,193,206,196,160,208,210,197
  283. 10530  DATA  211,211,160,210,197,212,213,210,206
  284. 10540  DATA  0
  285. 10550  REM 
  286. 10560  REM  TAB TABLE FOR ZAP
  287. 10570  REM 
  288. 10580  DATA  30,30,31,31,0,32,32,33,33,0,34,34,35,35,0,36,36,37,37,0
  289. 10970  REM 
  290. 10980  REM  ---- DISK ERROR HANDLER ----
  291. 10990  REM 
  292. 11000  HOME :XX =  PEEK(IERR)
  293. 11010  IF XX = 16  THEN S$ = " DISK IS WRITE PROTECTED "
  294. 11020  IF XX = 32  THEN S$ = "     VOLUME MISMATCH     "
  295. 11030  IF XX = 64  THEN S$ = "        I/O ERROR        "
  296. 11040  IF XX = 128  THEN S$ = "        READ ERROR       "
  297. 11050  INVERSE : VTAB 7: HTAB 8: PRINT  SPC( 25): VTAB 8: HTAB 8: PRINT S$: VTAB 9: HTAB 8: PRINT  SPC( 25)
  298. 11060  FOR XX = 1 TO 2500: NEXT 
  299. 11070  NORMAL 
  300. 11080  RETURN